热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

动手练习|3步用Python运行机器学习

根据经验,用Python运行机器学习包含了3个步骤:1.获取数据2.建立机器学习模型3.优化机器学习模型1.目标我们有2008~2018年的兽医数据集&

根据经验,用Python运行机器学习包含了3个步骤:

1. 获取数据

2. 建立机器学习模型

3. 优化机器学习模型

1.目标

我们有2008~2018年的兽医数据集,它包含了动物(狗、猫和雪貂)的注册信息。

如上图,数据集特征包含了时间戳、动物名称、体重(单位Kg)、表皮病学水平、是否有李氏杆菌病。

表皮病学水平的检测是非常昂贵的,且对动物可能有伤害,因此我们的目标是建立机器模型,通过其他特征预测表皮病学水平,从而防止动物受到伤害并能节约成本。

2.你需要准备什么

  • 任何版本的Python(https://www.python.org/downloads/)

  • Pip(https://www.makeuseof.com/tag/install-pip-for-python/)

  • 安装Sklearn ,Panda,openblender(利用Pip)

pip install pandas OpenBlender scikit-learn

  • 推荐使用Jupyter Notebook的Python编辑器(https://jupyter.org/install)

步骤1:获取数据

导入将要使用的Python库:

import OpenBlender
import pandas as pd
import numpy as np
import json
import sklearn
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

我们通过OpenBlender API获取数据。您需要在https://www.openblender.io中创建一个acount账户来获得一个令牌和user_id(它是免费的)

首先,我们定义参数(在本例中它只是数据集的id):

# It only contains the id, we'll add more parameters later.
parameters = {'token' : 'YOUR_TOKEN','id_user' : 'YOUR_USER_ID','id_dataset':'5db079199516296099c9fb1e'
}

数据转换为dataframe格式:

# This function pulls the data and orders by timestamp
def pullObservationsToDF(parameters):action = 'API_getObservationsFromDataset'df = pd.read_json(json.dumps(OpenBlender.call(action,parameters)['sample']), convert_dates=False,convert_axes=False) .sort_values('timestamp', ascending=False)df.reset_index(drop=True, inplace=True)return df
df_vet = pullObservationsToDF(parameters)

查看返回的dataframe数据:

print(df_vet.shape)
df_vet.head()

如上图,我们有800个数据,5个特征。

步骤2:建立机器学习模型

我们首先观察表皮病学水平和体重的关系:

%matplotlib inline
df_vet.plot.scatter('epidermiology_level', 'weight_in_kg')

由上图可知,表皮病学水平和体重呈负相关的关系。

我们首先用简单的线性回归模型来学习:

每个点的误差是给定输入值x,预测值和真实值的距离,最小化该误差来选择a和b。

通过数据集构建线性回归模型的代码:

# First we declare it
regr = LinearRegression()
# Then we fit (or train) it to relate epidermiology with weight
regr.fit(df_vet[['weight_in_kg']], df_vet[['epidermiology_level']])
# Let's take a look at the intercpt (Our 'a')
print(regr.intercept_)
# And the slope (Our 'b')
print(regr.coef_)

回归模型系数a和b的结果:

把该模型添加到上图:

axes = df_vet.plot.scatter('epidermiology_level', 'weight_in_kg')
x_vals = np.array(axes.get_xlim())
y_vals = 37.01155578 + -0.47164364 * x_vals
axes.plot(x_vals, y_vals, '-')

数据集划分为训练集和测试集,测试集的作用是检测机器学习模型的泛化水平:

# First we define 'X' and 'y'
X = df_vet[['weight_in_kg']]
y = df_vet[['epidermiology_level']]
# Then we separate 500 to train
X_train = X[:500]
y_train = y[:500]
print("Train X and y:")
print(X_train.shape)
print(y_train.shape)
# And 300 to test
X_test = X[500:]
y_test = y[500:]
print("Test X and y:")
print(X_test.shape)
print(y_test.shape)

我们利用均方误差(MSE)来测试模型的泛化水平:

# First we traqin the model with the Test Set
lm = LinearRegression()
lm.fit(X_test, y_test)
# Then we generate predictions and compare to ‘y’ test
predictions = lm.predict(X_test)
mean_squared_error(y_test, predictions)

测试集的均方误差:

输出预测值和真实值结果:

df_preds_res = pd.DataFrame({'y_test':y_test['epidermiology_level'], 'y_pred':pred[:,0]})
df_preds_res.head(15)

现在让我们看看是否可以通过增加输入变量来优化该模型。

步骤3:优化ML模型

线性回归的输入值一般是数值型的,我们首先将特征'animal'和'has_listeriosis'转换为数值类型。

转换前的数据:

转换代码:

#We add the 'categorical_treatment' parameter and pull again.
parameters = {'token' : 'YOUR_TOKEN','id_user' : 'YOUR_USER_ID','id_dataset':'5db079199516296099c9fb1e','categorical_treatment': {"treatment" : "convert_to_numeric", "exclude" : ["weight_in_kg"]}
}
df_vet_numerical = pullObservationsToDF(parameters)

转换后的数据:

为了获得更多有用的特征,我们将日期细分为许多与时间相关的特征,如星期几,几月份。

parameters = {'token' : 'YOUR_TOKEN','id_user' : 'YOUR_USER_ID','id_dataset':'5db079199516296099c9fb1e','categorical_treatment': {"treatment" : "convert_to_numeric",'exclude' : ["weight_in_kg"]},'date_treatment':{"treatment":"breakdown"}
}
df_vet_numerical = pullObservationsToDF(parameters)
df_vet_numerical.columns

特征有:

数据集划分为训练集和测试集:

target_variable = 'epidermiology_level'
# First we define ‘X’ and ‘y'
X = df_vet_numerical.loc[:, df_vet_numerical.columns != target_variable].values
y = df_vet_numerical.loc[:,[target_variable]].values
# Then we separate 500 to train
X_train = X[:500]
y_train = y[:500]
print("Train X and y:")
print(X_train.shape)
print(y_train.shape)
# And 300 to test
X_test = X[500:]
y_test = y[500:]
print("Test X and y:")
print(X_test.shape)
print(y_test.shape)

现在我们有30个特征构建回归模型,表达式为:

对比单变量的线性回归模型,看看MSE是否有降低。

# First we traqin the model with the Test Set
lm = LinearRegression()
lm.fit(X_test, y_test)
# Then we generate predictions and compare to ‘y’ test
pred = lm.predict(X_test)
mean_squared_error(y_test, pred)

由结果可知,多变量的MSE降低了,因此多变量的模型性能更好了。

输出预测值和真实值。

df_preds_res = pd.DataFrame({'y_test':y_test[:,0], 'y_pred':pred[:,0]})
df_preds_res.head(15)

推荐阅读

干货 | 清晰易懂的机器学习算法原理介绍

欢迎扫码关注:


推荐阅读
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
author-avatar
mobiledu2502899415
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有